package main

import "fmt"

type ST struct {
	Name  string
	Age   int
	Data  []int
	Data2 map[string]string
}

func (st *ST) Say() { //如果这里不加×号，st2.Name就会为空
	st.Name = "zhanglin"
}

func main() {

	var st *ST      // 声明一个类型为ST的变量，并未分配内存地址，此时是空指针
	fmt.Println(st) // <nil>
	// st.Say()  // 空指针也就不会有对应的属性

	var st2 ST       // 直接初始化一个ST
	fmt.Println(st2) // { 0 [] map[]}
	//fmt.Println(st2.Name)    // ""
	st2.Say()
	fmt.Println(st2.Name) // zhanglin

	var st3 = new(ST) // 等价于 var st3 = &ST{}
	fmt.Println(st3)  // &{ 0 [] map[]}

	// 使用 & 和不使用 & 赋值的区别
	var res = make(map[string]ST)
	res["key"] = ST{}
	v := res["key"]
	v.Say()
	// res["key"] = v  // 加上这个值才会更新
	fmt.Println(1111, v.Name) // zhanglin
	t := res["key"]
	fmt.Println(2222, t.Name) // ""

	var res2 = make(map[string]*ST)
	res2["key"] = &ST{}
	v2 := res2["key"]
	v2.Say()
	fmt.Println(33333, v2.Name) // zhanglin
	t2 := res2["key"]
	fmt.Println(44444, t2.Name) // zhanglin

	s := &ST{}
	s.Data = append(s.Data, 1) // 这里不会报错，空切片也可以append
	fmt.Println(s)             // &{ 0 [1] map[]}
	s.Data2["a"] = "1"         //这里会报错，nil map，因此map需要初始化
	fmt.Println(s)
}
